<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //1、不是var声明的变量不会提升，保错 a is not defined
      /*  alert(a);
      a = 0; */

      //   2、var声明的变量会提升变量声明，赋值不会提升
      /*   alert(a);
      var a = 0;
      alert(a); */
      /* 
        var a;
        alert(a);//undefined
        a = 0;
        alert(a);//0

      */

      // 当函数和var的变量重名的使用，函数和var的变量提升，函数优先级高，函数覆盖变量，
      //   console.log(a);
      //   var a = "我是变量";
      //   function a() {
      //     console.log("我是函数");
      //   }
      //   a(); //保错， a = "我是变量";a就不是函数
      //   console.log(a);

      /* 
      var a =function(){
        console.log("我是函数");
      }
    console.log(a);
     a = "我是变量";
     a()  //保错， a = "我是变量";a就不是函数

    console.log(a);
    
    */

      //   console.log(a);
      //   a++;
      //   console.log(a);
      //   var a = "我是变量";
      //   function a() {
      //     console.log("我是函数");
      //   }
      //   console.log(a);

      /* 
      var a = function(){
        alert("我是函数");
      }
      var a ;
      console.log(a);
      a++; // 函数体 ++，
     console.log(a);//NaN

      a = "我是变量";
      console.log(a);
    
    */

      //   console.log(a);
      //   var a = 0;
      //   console.log(a);
      //   function fn() {
      //     console.log(a);
      //     var a = 1;
      //     console.log(a);
      //   }
      //   fn();
      //   console.log(a);

      /* 
      函数内部也会发生预解析
        var fn=function(){
            var a;
            alert(a)//3、 undefined
            a = 1;
            alert(a)//4、1
        }
        var a;  
        alert(a);// 1、undefined
         a = 0;
        alert(a);//2、0
        fn();
        alert(a);//4、0
    */

      console.log(a);
      var a = 0;
      console.log(a);
      function fn() {
        console.log(a);
        a = 1;
        console.log(a);
      }
      fn();
      console.log(a);

      /* 
      var fn=function(){
        alert(a)// 3、外面找 0
         a = 1;
        alert(a)// 4、   1
      }
      var a
       alert(a); //1、undefined
       a = 0;
       alert(a);//2、 0
       fn();
      alert(a);// 5、 1
    */

      /* 
      预解析总结
            1、提升变量（带var的变量提升 ，提升声明）   ，和提升函数（整个函数都提升）
            2、提升变量和和提升函数命名冲突，函数优先级高，函数覆盖变量
    */
    </script>
  </body>
</html>
